#include "sbi.h"
#include "type.h"



register_t
sbi_call(register_t sbi_type, register_t arg0, register_t arg1, register_t arg2) {
    register_t ret_val;
    __asm__ volatile(
        "mv a7, %[sbi_type]\n"
        "mv a0, %[arg0]\n"
        "mv a1, %[arg1]\n"
        "mv a2, %[arg2]\n"
        "ecall\n"
        "mv %[ret_val], a0"
        : [ret_val] "=r"(ret_val)
        : [sbi_type] "r"(sbi_type), [arg0] "r"(arg0), [arg1] "r"(arg1), [arg2] "r"(arg2)
        : "memory");
    return ret_val;
}

void
sbi_putchar(byte_t ch) {
    sbi_call(SBI_PUTCHAR, (register_t)(ch & 0xff), 0, 0);
}

byte_t
sbi_getchar(void) {
    return (byte_t)(sbi_call(SBI_GETCHAR, 0, 0, 0) & 0xff);
}

void sbi_set_time(register_t time)
{
    sbi_call(SBI_SET_TIMER, time, 0, 0);
}

// void sbi_set_extern_interrupt(address_t func_pointer)
// {
//     sbi_call(0x09, func_pointer, 0, 0);
// }

void sbi_set_mie(void)
{
    sbi_call(0x0A000005, 0, 0, 0);
}